package com.zhl.stream7;
/*
    Stream<T> filter(Predicate<? super T> predicate)        过滤，过滤掉不符合条件的元素
    Stream<T> sorted()                                       排序，默认按照自然排序
    Stream<T> sorted(Comparator<? super T> comparator)      排序，按照比较器规则排序
    Stream<T> limit(long maxSize)                            截取，限制Stream流的最大长度
    Stream<T> skip(long n)                                   跳过，跳过前n个元素
    Stream<T> distinct()                                     去重，只保留唯一的元素
    <R> Stream<R> map(Function<? super T,? extends R> mapper)  对元素进行加工并返回对应的新流
    static <T> Stream<T> concat(Stream a, Stream b)           合并两个流a,b    返回合并后的流
 */


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;

public class StreamTest3 {
    public static void main(String[] args) {
        List<Double> score = new ArrayList<>();
        Collections.addAll(score,88.5,100.0,60.0,99.0,9.5,99.6,25.0);
        //需求1：找出成绩大于等于60分的数据,并升序后，再输出
        //forEach终结方法用来做遍历输出的
        score.stream().filter(s -> s >= 60.0).sorted().forEach(s -> System.out.println(s));


        List<Student> students = new ArrayList<>();
        Student s1 = new Student(25,176.5,"蜘蛛精");
        Student s2 = new Student(25,176.5,"蜘蛛精");
        Student s3 = new Student(20,160.0,"紫霞仙子");
        Student s4 = new Student(52,170.0,"白晶晶");
        Student s5 = new Student(23,180.0,"白雪公主");
        Student s6 = new Student(34,185.0,"牛夫人");
        Collections.addAll(students,s1,s2,s3,s4,s5,s6);
        //需求2：找出年龄大于22，且年龄小于30的学生，并按照年龄降序排序，再输出
        students.stream().filter(s -> s.getAge() > 22 && s.getAge() < 30).sorted((o1, o2) -> o2.getAge() - o1.getAge()).forEach(s -> System.out.println(s));


        //需求3：找出身高前三的学生并输出
        students.stream().sorted((o1, o2) -> Double.compare(o2.getHeight(), o1.getHeight())).limit(3).forEach(System.out::println);

        //需求4：找出身高倒数的2个学生并输出
        students.stream().sorted((o1, o2) -> Double.compare(o2.getHeight(), o1.getHeight())).skip(students.size()-2).forEach(System.out::println);


        //需求5：找出身高大于175cm的学生叫什么，并去除重复的名字，再输出
        students.stream().filter(s -> s.getHeight() > 175.0).map(Student::getName).distinct().forEach(System.out::println);

    }

}
